import { Device } from "./Device";
import { Hub } from "./Hub";
import { Message } from "./typings/index";

/**
 * 电脑设备
 */
export class Computer extends Device {
  // 集线器只是做转发，并不属于设备，所以这里单独模拟一个对象存储 
  hub: Hub | null = null;
  linkDevices: { [mac: string]: Device } = {};

  constructor(mac: string) {
    super(mac);
  }

  /**
   * 模拟电脑网线连接
   * @param device
   */
  linkHub(device: Hub) {
    this.hub = device;
  }

  override linkDevice(device: Device) {
    this.linkDevices[device.mac] = device;
  }

  /**
   * 发送消息
   * @param message 需要发送的消息
   * @param device 需要发送的设备，如果存在就指定设备发送，如果不存在就发送到所有设备
   * @returns
   */
  override sendMessage(message: string, device?: Device): void {
    if (device) {
      return this.hub?.sendMessage({
        message,
        target: device.mac,
        source: this.mac,
      });
    }

    this.hub?.sendMessage({ message, source: this.mac });
  }

  /**
   * 模拟收消息的过程
   * @param message
   */
  receiveMessage({ message, target, source }: Message) {
    // 如果目标地址和当前mac地址相同，则处理消息
    if (target === this.mac) {
      console.log(`${source} to ${this.mac}: ${message}`);
    }
    // 如果有目标地址,那么就直接返回了
    if (target) return;
    // 如果没有目标地址，那么就是发给所有人的消息
    console.log(`${source} to All: ${message}`);
  }
}
